package qmt

import (
	"encoding/json"
	"fmt"
	"io"
	"quant/backend/constants"
	"quant/backend/utils"

	"github.com/duke-git/lancet/v2/convertor"
	"github.com/sirupsen/logrus"
)

// QueryStockPositions 查询持仓
func QueryStockPositions() ([]PositionModel, error) {
	response, err := utils.HttpGet(constants.MiniQMTBaseUrl+"/query_stock_positions", nil, nil)
	if err != nil {
		logrus.Error("error:", err)
		return nil, err
	}
	var positions []PositionModel
	// body:
	// [ {
	//  "can_use_volume" : 100,
	//  "market_value" : 567.0,
	//  "price" : 5.802899999999999,
	//  "stock_code" : "300459.SZ",
	//  "volume" : 100
	// } ]
	if body, err := io.ReadAll(response.Body); err == nil {
		logrus.Info(string(body))
		_ = json.Unmarshal(body, &positions)
		logrus.Info(positions)
		return positions, nil
	} else {
		logrus.Error("error:", err)
		return nil, err
	}
}

// QueryStockAsset 查询可用余额
// 该函数向服务器发送HTTP GET请求，获取股票资产信息，并将返回的字符串转换为float64类型
// 参数: 无
// 返回值:
//   - float64: 股票资产值
//   - error: 错误信息，如果请求成功则为nil
func QueryStockAsset() (float64, error) {
	// 发送HTTP GET请求获取股票资产数据
	response, err := utils.HttpGet(constants.MiniQMTBaseUrl+"/query_stock_asset", nil, nil)
	if err != nil {
		logrus.Error("error:", err)
		return 0.0, err
	}

	// 读取并解析响应数据
	if body, err := io.ReadAll(response.Body); err == nil {
		logrus.Info(string(body))
		val, err := convertor.ToFloat(string(body))
		if err != nil {
			return 0.0, err
		}
		return val, nil
	} else {
		logrus.Error("error:", err)
		return 0.0, err
	}
}

// BuyStock 购买股票
// stockCode: 股票代码
// price: 股票价格
// 返回值1: 购买结果信息
// 返回值2: 错误信息
func BuyStock(stockCode string, price float64) (string, error) {
	// 获取可用余额
	asset, err := QueryStockAsset()
	if err != nil {
		return "", err
	}
	// 获取当前持仓股票列表
	positions, err := QueryStockPositions()
	if err != nil {
		return "", err
	}
	var volume int64
	// 检查是否达到最大持仓数量限制
	if len(positions) == constants.StockCount {
		return "", fmt.Errorf("当前持仓股票数量已经达到最大值")
	} else {
		// 计算可购买的股票数量
		amount := asset / float64(constants.StockCount-len(positions))
		volume, _ = convertor.ToInt(amount / (price * 100))

		// 发送购买股票的HTTP请求
		response, err := utils.HttpGet(constants.MiniQMTBaseUrl+fmt.Sprintf("/buy_stock/%s/%d", stockCode, volume*100), nil, nil)
		if err != nil {
			logrus.Error("error:", err)
			return "", err
		}
		// 读取并返回响应结果
		if body, err := io.ReadAll(response.Body); err == nil {
			return string(body), nil
		} else {
			logrus.Error("error:", err)
			return "", err
		}
	}
}

// SellStock 卖出股票
// 参数:
//
//	stockCode: 股票代码字符串
//
// 返回值:
//
//	string: 服务器返回的响应内容
//	error: 执行过程中可能发生的错误
func SellStock(stockCode string) (string, error) {
	// 发送HTTP GET请求到卖出股票的接口
	response, err := utils.HttpGet(constants.MiniQMTBaseUrl+fmt.Sprintf("/sell_stock/%s", stockCode), nil, nil)
	if err != nil {
		logrus.Error("error:", err)
		return "", err
	}

	// 读取并返回响应内容
	if body, err := io.ReadAll(response.Body); err == nil {
		return string(body), nil
	} else {
		logrus.Error("error:", err)
		return "", err
	}
}
